package xkp.lesson4;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;


/**
 * 主线程负责接收客户端
 * 子线程处理每一个客户端  一个客户端对应一个线程
 */
public class Server {
    public static void main(String[] args) throws IOException {
        //监听端口
        ServerSocket serverSocket = new ServerSocket(12345);
        System.out.println("服务端监听端口12345,等待客户端连接....");
        //使用List集合存储连接到的客户端
        //客户端上线，添加到List集合，下线移除
        List<Socket> clientList = new ArrayList<>();
        while (true) {
            //循环等待客户端连接
            //accept方法也会阻塞，如果没有客户端来，会一直等待
            Socket socket = serverSocket.accept();
            //连接成功添加到List集合中
            clientList.add(socket);
            //如果上线，也应该通知所有人
            RevThread.sendToAll(socket.getRemoteSocketAddress() + "上线", clientList);
            //InetSocketAddress包含远端主机IP/主机名/端口号
            InetSocketAddress clientAdd = (InetSocketAddress) socket.getRemoteSocketAddress(); //获取远端的IP地址+端口号
            //服务器IP地址和端口号
            InetSocketAddress serverAdd = (InetSocketAddress) socket.getLocalSocketAddress();
            System.out.println(clientAdd.getAddress() + ":" + clientAdd.getPort() + "-->" +
                    serverAdd.getAddress() + ":" + serverAdd.getPort() + "||连接成功");
            //每一个客户端对应一个线程处理
            new RevThread(socket, clientList).start();
        }
    }
}

